% main.m
% MATLAB 版本的主执行脚本。
% *** 已重构为调用顶层评估函数 evaluate_schedule ***
clear; clc; close all;
% --- 1. 设置参数 ---
case_name = 'Conv_Case0';
fprintf('--- 正在处理算例: %s ---\n', case_name);

% *** 新增: 将参数结构化, 以便传递给评估函数 ***
% 定义硬件容量
caps = struct('l1', 4096, 'ub', 1024, 'l0a', 256, 'l0b', 256, 'l0c', 512);
% 定义策略控制参数
params = struct();
params.alloc_strategy = 'BestFit'; % 可选: 'BestFit', 'LowAddress', 'LifetimeAware'
params.min_farthest_use_threshold = 500; % 最小未来使用距离阈值
params.w_use = 0.5;  % Farthest Use 权重
params.w_vol = 0.3;  % Spill Volume 权重
params.w_vic = 0.2;  % Victim Count 权重

% --- 2. 加载计算图和调度文件 ---
nodes_file = [case_name, '_Nodes.csv'];
edges_file = [case_name, '_Edges.csv'];
[graph, code_map] = load_graph(nodes_file, edges_file);
fprintf('计算图加载完成。\n');
p1_schedule_file = [case_name, '_final_schedule_optimized.txt'];
p1_schedule = load_schedule_from_file(p1_schedule_file);
fprintf('问题1调度结果加载完成，共 %d 个节点。\n', length(p1_schedule));

% --- 3. 调用评估函数获取结果 ---
fprintf('\n--- 开始执行调度评估 ---\n');
% *** 已修改: 使用一行代码调用新的顶层评估函数 ***
[total_execution_time, total_spill_volume, solution, graph] = evaluate_schedule(p1_schedule, graph, code_map, caps, params);
fprintf('调度评估完成。\n');

% --- 4. 显示评估指标 ---
fprintf('\n--- 求解结果 ---\n');
fprintf('总额外数据搬运量 (Total Spill Volume): %d\n', total_spill_volume);
fprintf('总执行时间 (Total Execution Time): %d cycles\n', total_execution_time);

% --- 5. 最终验证 ---
fprintf('\n--- 开始最终验证 ---\n');
is_valid = validate_solution(solution, graph, code_map, caps.l1, caps.ub, caps.l0a, caps.l0b, caps.l0c);
if is_valid
    fprintf('验证通过: 最终解决方案满足所有约束。\n');
else
    fprintf('!!! 验证失败: 最终解决方案存在问题 !!!\n');
end

% --- 6. 保存结果 ---
fprintf('\n--- 开始保存结果 ---\n');
output_dir = 'Problem2_MATLAB';
if ~exist(output_dir, 'dir')
   mkdir(output_dir);
end
write_schedule_to_file(fullfile(output_dir, [case_name, '_schedule.txt']), solution.final_schedule);
write_memory_to_file(fullfile(output_dir, [case_name, '_memory.txt']), solution.memory_offsets);
spill_log_for_file = format_spill_log_for_output(solution.spill_map, graph);
write_spill_to_file(fullfile(output_dir, [case_name, '_spill.txt']), spill_log_for_file);
fprintf('所有结果已成功保存至 ./%s 目录。\n', output_dir);

% --- 7. 可视化 ---
fprintf('\n--- 开始生成可视化图表 ---\n');
history = run_simulation_for_viz(solution, graph, code_map, caps.l1, caps.ub, caps.l0a, caps.l0b, caps.l0c);
target_type_code = code_map.L1;
target_capacity = caps.l1;
viz_dir = fullfile(output_dir, 'visualizations');
if ~exist(viz_dir, 'dir'), mkdir(viz_dir); end
file_prefix = case_name;
visualize_fragmentation(history, target_type_code, viz_dir, file_prefix);
visualize_gantt_chart(history, target_type_code, target_capacity, viz_dir, file_prefix);
visualize_buffer_lifetimes(history, target_type_code, viz_dir, file_prefix);
fprintf('可视化图表已保存至 %s。\n', viz_dir);